/**
 * 该方法主要是用于输入控件(可写Div或Input)失去焦点进行校验.
 * 该方法目前不支持累计提示
 * @Param _inputObj   {Object}   代表该控件的对象
 * @Param _checkFuns  {String[]} 代表所有校验该控件值的校验方法的数组集合。
 * @Param _errMsg     {String}   代表校验错误应提示的信息
 * @Param _errStyle   {String}   代表显示错误信息的className
 * @Param _rightMsg   {String}   代表输入正确应提示的信息
 * @Param _rightStyle {String}   代表显示正确信息的className
 * @Param _hintType   {int}      代表显示提示信息的类型  0 代表用alert显示， 1 代表在当前控件所属容器的末尾显示
 * @Date 2007-05-09
 * @Author meconsea
 *
 */
function checkInput(_inputObj,_checkFuns,_errMsg,_errStyle,_rightMsg,_rightStyle,_hintType){
	 var _hintMsgText ;
	 var _isErr = true;
	 if(_checkFuns != null && _checkFuns.length > 0){
	 	  for(var i = 0; i < _checkFuns.length; i++){
	 	  	 if(!eval(_checkFuns[i])){
	 	  	 	  _isErr = false;
	 					break;	  	 		
	 	  	 }
	 	  }
	 }
	 var _objName = _inputObj.name;
	 if(_hintType == 1){
		 var _objSpan  = $(_objName+"_hintMsg");
		 if(_objSpan == null || _objSpan == 'undefined' || _objSpan == undefined){// append child object
		 		var el = document.createElement("span");
		 		el.setAttribute("id",_objName+"_hintMsg");
		 		if(_isErr && _rightMsg.length > 0){
		 			el.setAttribute("className",_rightStyle);
			 		el.innerHTML=_rightMsg;
			 	}else if(!_isErr && _errMsg.length > 0){
			 		el.setAttribute("className",_errStyle);
			 		el.innerHTML = _errMsg;	
			 	}
		 		_inputObj.parentNode.appendChild(el);
		 }else{// change innerHTML 
		 	 	if(_isErr && _rightMsg.length > 0){
		 	 		$(_objName+"_hintMsg").className=_rightStyle;
			 		$(_objName+"_hintMsg").innerHTML= _rightMsg; 
			 	}else if(!_isErr && _errMsg.length > 0){
			 		$(_objName+"_hintMsg").className=_errStyle;
			 		$(_objName+"_hintMsg").innerHTML= _errMsg;	
			 	}
		 }
	 }else if(_hintType == 0){
		 	if(_isErr && _rightMsg.length > 0){
		 		alert(_rightMsg); 
		 	}else if(!_isErr && _errMsg.length > 0){
		 		alert(_errMsg);	
		 	}
	 }
}
/**
 * 该方法用于处理输入控件在获取焦点的时候给于的提示信息
 * @Param _inputObj  {Object} 代表该控件的对象
 * @Param _hintMsg   {String} 代表提示信息的内容
 * @Param _hintStyle {String} 代表提示信息的显示样式的className
 * @Param _hintType  {int}    代表显示提示信息的类型  0 代表用alert显示， 1 代表在当前控件所属容器的末尾显示
 * @Date 2007-05-09
 * @Author meconsea
 */
function clickInput(_inputObj,_hintMsg,_hintStyle,_hintType){
	var _hintMsgText ;
	var _objName = _inputObj.name;
	 if(_hintType == 1){
		 var _objSpan  = $(_objName+"_hintMsg");
		 if(_objSpan == null || _objSpan == 'undefined' || _objSpan == undefined){
		 		var el = document.createElement("span");
		 		el.setAttribute("id",_objName+"_hintMsg");
		 		if(_hintMsg.length > 0){
		 			el.setAttribute("className",_hintStyle);
			 		el.innerHTML=_hintMsg;
			 	} 
		 		_inputObj.parentNode.appendChild(el);
		 }else{
		 	 	if(_hintMsg.length > 0){
		 	 		$(_objName+"_hintMsg").className=_hintStyle;
			 		$(_objName+"_hintMsg").innerHTML= _hintMsg;
			 	} 
		 }
		 
	 }else if(_hintType == 0){
		 	if(_hintMsg.length > 0){
		 		alert(_hintMsg); 
		 	}
	 }
}

/**
 * 去掉字符串的首尾空格
 */
String.prototype.trim = function(){
	return this.replace( /(^\s*)|(\s*$)/g, '' ) ;
}
/**
 * 判断字符串是否以value开始
 */
String.prototype.startsWith = function( value ){
	return ( this.substr( 0, value.length ) == value ) ;
}
/**
 * 把字符串从开始位移走指定长度
 *
 */
String.prototype.remove = function( start, length ){
	var s = '' ;

	if ( start > 0 )
		s = this.substring( 0, start ) ;

	if ( start + length < this.length )
		s += this.substring( start + length , this.length ) ;

	return s ;
}

/**
 * 根据指定的正则表达式进行检测的函数
 * @param {Object} regexp
 * @param {Object} inputstring
 */
function checkByRegexp(regexp,inputstring){
	if (inputstring.length<1){
		return false;
	}
	if (!regexp.test(inputstring)){
		return false;
	}
	return true;
}
 
/**
 * 判断是否为整数、正整数、负整数、正整数+0、负整数+0
 * @param {string} objStr  '测试字符串'
 * @param {string} sign    + or - or empty
 * @param {string} zero    empty or 0
 */
function IsInt(objStr,sign,zero){
    var reg;
    var bolzero;

    if(objStr.trim()==''){
        return false;
    }else{
        objStr=objStr.toString();
    }
    
    if((sign==null)||(sign.trim()=='')){
        sign="+-";
    }
    
    if((zero==null)||(zero.trim()=='')){
        bolzero=false;
    }else{
        zero=zero.toString();
        if(zero=='0'){
            bolzero=true;
        }else{
            alert('检查是否包含0参数，只可为(空、0)');
        }
    }
    
    switch(sign){
        case "+-":
            //整数
            reg=/(^-?|^\+?)\d+$/;
            break;
        case "+":
            if(!bolzero){
                //正整数
                reg=/^\+?[0-9]*[1-9][0-9]*$/;
            }else{
                //正整数+0
                //reg=/^\+?\d+$/;
                reg=/^\+?[0-9]*[0-9][0-9]*$/;
            }
            break;
        case "-":
            if(!bolzero){
                //负整数
                reg=/^-[0-9]*[1-9][0-9]*$/;
            }else{
                //负整数+0
                //reg=/^-\d+$/;
                reg=/^-[0-9]*[0-9][0-9]*$/;
            }
            break;
        default:
            alert("检查符号参数，只可为(空、+、-)");
            return false;
            break;
    }

    var r=objStr.match(reg);
    
    if(r==null){
        return false;
    }else{
        return true;
    }
}

  
/**
 * 判断是否为浮点数、正浮点数、负浮点数、正浮点数+0、负浮点数+0
 * @param {string} objStr   '测试字符串'
 * @param {string} sign     + or - or empty
 * @param {string} zero     empty
 */
function IsFloat(objStr,sign,zero){
    var reg;
    var bolzero;

    if(objStr.trim()==""){
        return false;
    }else{
        objStr=objStr.toString();
    }

    if((sign==null)||(sign.trim()=="")){
        sign="+-";
    }

    if((zero==null)||(zero.trim()=="")){
        bolzero=false;
    }else{
        zero=zero.toString();
        if(zero=="0"){
            bolzero=true;
        }else{
            alert("检查是否包含0参数，只可为(空、0)");
        }
    }

    switch(sign){
        case "+-":
            //浮点数
            reg=/^((-?|\+?)\d+)(\.\d+)?$/;
            break;
        case "+":
            if(!bolzero){
                //正浮点数
                reg=/^\+?(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;
            }else{
                //正浮点数+0
                reg=/^\+?\d+(\.\d+)?$/;
            }
            break;
        case "-":
            if(!bolzero){
                //负浮点数
               reg=/^-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;
            }else{
                //负浮点数+0
                reg=/^((-\d+(\.\d+)?)|(0+(\.0+)?))$/;
            }
            break;
        default:
            alert("检查符号参数，只可为(空、+、-)");
            return false;
            break;
    }

    var r=objStr.match(reg);
    if(r==null){
        return false;
    }else{
        return true;
    }
}

 
/**
 * 身份证校验
 * @param {Object} idcard
 */
function checkIdcard(idcard){
	 idcard = idcard.trim();
	 var Errors=new Array(
	 "验证通过!",
	 "身份证号码位数不对!",
	 "身份证号码出生日期超出范围或含有非法字符!",
	 "身份证号码校验错误!",
	 "身份证地区非法!"
	 );
	 var area={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};	 
	 var idcard,Y,JYM;
	 var S,M;
	 var idcard_array = new Array();
	 idcard_array = idcard.split("");
	 /*地区检验*/
	 if(area[parseInt(idcard.substr(0,2))]==null){
		  alert(Errors[4]); 
		  return false;
	 }
	 /*身份号码位数及格式检验*/
	 switch(idcard.length){
		  case 15:
		  if ( (parseInt(idcard.substr(6,2))+1900) % 4 == 0 || ((parseInt(idcard.substr(6,2))+1900) % 100 == 0 && (parseInt(idcard.substr(6,2))+1900) % 4 == 0 )){
		   	ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/;//测试出生日期的合法性
		  } else {
		   	ereg=/^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/;//测试出生日期的合法性
		  }
		  if(ereg.test(idcard)){
		    	return true;
		   }else {
		    	alert(Errors[2]);
		     	return false;
		   }
	 	  break;
	  
		  case 18:
		  //18位身份号码检测
		  //出生日期的合法性检查 
		  //闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
		  //平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
		  if ( parseInt(idcard.substr(6,4)) % 4 == 0 || (parseInt(idcard.substr(6,4)) % 100 == 0 && parseInt(idcard.substr(6,4))%4 == 0 )){
		  	ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/;//闰年出生日期的合法性正则表达式
		  } else {
			  ereg=/^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/;//平年出生日期的合法性正则表达式
		  }
		  if(ereg.test(idcard)){//测试出生日期的合法性
				   //计算校验位
				   S = (parseInt(idcard_array[0]) + parseInt(idcard_array[10])) * 7
				   + (parseInt(idcard_array[1]) + parseInt(idcard_array[11])) * 9
				   + (parseInt(idcard_array[2]) + parseInt(idcard_array[12])) * 10
				   + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5
				   + (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8
				   + (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4
				   + (parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2
				   + parseInt(idcard_array[7]) * 1 
				   + parseInt(idcard_array[8]) * 6
				   + parseInt(idcard_array[9]) * 3 ;
				   Y = S % 11;
				   M = "F";
				   JYM = "10X98765432";
				   M = JYM.substr(Y,1);/*判断校验位*/
				   if(M == idcard_array[17]){
				    return true; /*检测ID的校验位*/
			   }else {
		    		alert(Errors[3]); 
		    		return false;
		   	   }
		  }else {
		   	alert(Errors[2]); 
		   	return false;
		  }
	  	break;
  
  	  	default:
      		alert(Errors[1]); 
   	  		return false;
   	  	}
}

/**
 * 验证是否是手机号码
 * @param {String} _s 手机号
 */
function isMobil(_s){
	var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
	if (!patrn.test(_s)) return false;
	return true;
}
/**
 * 验证是否为电话号码
 * @param {String} _tel
 */
function isTel(_tel){
	var patrn = /^(((\()?\d{2,4}(\))?[-(\s)*]){0,2})?(\d{7,8})$/;
	if(patrn.test(_tel)){
		return true;
	}else{
		return false;
	}
}

/**
 * 验证是否为email
 * @param {String} _mail
 */
function isEmail(_mail){
	return(new RegExp(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(_mail));
}

/**
 * 验证是否为邮编
 * @param {String} zip 
 */
function isZIP(zip){
	var regexp=/^\d{6}$/;
	return checkByRegexp(regexp,zip);
}

/**
 * 验证是否为IP
 * @param {String} _s
 */
function isip(_s){
	var check=function(v){try{return (v<=255 && v>=0)}catch(x){return false}};
	var re=_s.split(".")
	return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false
}

/**
 * 短时间，形如 (13:04:06)
 * @param {String} str 
 */
function isTime(str){
  var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
  if (a == null) {alert('输入的参数不是时间格式'); return false;}
  if (a[1]>24 || a[3]>60 || a[4]>60){
    return false
  }
  return true;
}
/**
 * 短日期，形如 (2007/05/10  2007-05-10)
 * @param {String} str
 */
function isDate(str){
   var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); 
   if(r==null)return false; 
   var d= new Date(r[1], r[3]-1, r[4]); 
   return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
}
/**
 * 长时间，形如 (2007-05-10 13:04:06)
 * @param {String}
 */
function isDateTime(str){
  var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; 
  var r = str.match(reg); 
  if(r==null)return false; 
  var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); 
  return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
}

/**
 *  isEmpty(String,int)
 *  @param {String}inputStr 待验证的字符串
 *  @param {int}_marks  0 代表不处理空格 1 代表处理空格
 */
function isEmpty(_inputStr,_marks){
	 var _tIS = ""+_inputStr;
	 if(_marks == 1){
	 		_marks = _marks.trim();
	 }
	 if(_tIS.length > 0)	{
	 	  return true;	
	 }else{
	 	  return false;	
	 }
}

/**
 * strParseInt(String,int)
 * @param {String}_str 要转换的字符串
 * @param {int}_default 如果转换不成功则赋默认值
 */
function strParseInt(_str,_default){
	 if(isInt(_str)){
	 		return parseInt(_str);	
	 }else{
	 	  return _default;	
	 }
}

/**
 * strParseFloat(String,float)
 * @param {String}_str 要转换的字符串
 * @param {float}_default 如果转换不成功则赋默认值
 */

function strParseFloat(_str,_default){
	 if(isFloat(_str)){
	 	  return parseFloat(_str);	
	 }else{
	 		return _default;
	 }
}

/**
 * isID(String)
 * @param {String}_inputStr 要验证的用户名
 * 默认的为字母 数字 下划线组合,且只能以字母或下划线开始
 */
function isID(_inputStr){
	return /^([a-zA-z_]{1})([\w]*)$/g.test(_inputStr);
}

/**
 * 判断字符串中是否含有中文字符或全角字符
 * isChinese(String) 
 * @param {String}_inputStr 待验证的字符串
 * @return 如果含有中文则false。
 */
function isChinese(_inputStr){
	//如果值为空，通过校验
	if (_inputStr == "")
	    return true;
	var pattern = /^([u4E00-u9FA5]|[uFE30-uFFA0])*$/gi;
	if (pattern.test(_inputStr))
	    return true;
	else
	    return false; 
}
/**
 * 字符串的实际长度，一个汉字代表两个字符。
 */
String.prototype.realLength = function(){
	return this.replace(/[^x00-xff]/g,"xx").length;
}
/** 
 * 校验字符串是否符合自定义正则表达式
 * str 要校验的字串  pat 自定义的正则表达式
 * 返回值：
 * 如果为空，定义校验通过，           返回true
 * 如果字串符合，校验通过，           返回true
 * 如果字串不符合，                   返回false    参考提示信息：必须满足***模式
 */
function checkMask(str,pat){
    //如果值为空，通过校验
    if (str == "")
        return true;
    var pattern = new RegExp(pat,"gi")
    if (pattern.test(str))
        return true;
    else
        return false;
} 

/**
 * 比较两个日期值的大小.返回值1：date1>date2;-1:date1<date2;0:date1=date2;-2:表示日期格式有误
 */
function compareDate(date1,date2){
	var regexp=/^(\d{1,4})[-|\.]{1}(\d{1,2})[-|\.]{1}(\d{1,2})$/;
	//首先检测日期值的有效性
	if (!isDate(date1) || !isDate(date2)){
		return -2;
	}
	var date1Year;
	var date1Month;
	var date1Day;
	var date2Year;
	var date2Month;
	var date2Day;
	regexp.test(date1);
	date1Year=RegExp.$1;
	date1Month=RegExp.$2;
	date1Day=RegExp.$3;

	regexp.test(date2);
	date2Year=RegExp.$1;
	date2Month=RegExp.$2;
	date2Day=RegExp.$3;
	if (date2Year>date1Year){
		return -1;
	}else if(date2Year<date1Year){
		return 1;
	}else{
		if (date2Month>date1Month){
			return -1;
		}else if (date2Month<date1Month){
			return 1;
		}else{
			if (date2Day>date1Day){
				return -1;
			}else if(date2Day<date1Day){
				return 1;
			}else{
				return 0;
			}
		}
	}
}

/**
 *  比较两个时间值的大小.返回值1：time1>time2;-1:time1<time2;0:time1=time2;-2:表示时间格式有误
 */
function compareTime(time1,time2){
	//首先检测时间值的有效性
	if (!isTime(time1) || !isTime(time2))
	{
		return -2;
	}
	var regexp=/^(\d+):(\d+):(\d+)$/;

	var time1Hour;
	var time1Minute;
	var time1Second;
	var time2Hour;
	var time2Minute;
	var time2Second;
	regexp.test(time1);
	time1Hour=RegExp.$1;
	time1Minute=RegExp.$2;
	time1Second=RegExp.$3;

	regexp.test(time2);
	time2Hour=RegExp.$1;
	time2Minute=RegExp.$2;
	time2Second=RegExp.$3;
	if (time2Hour>time1Hour){
		return -1;
	}else if(time2Hour<time1Hour){
		return 1;
	}else{
		if (time2Minute>time1Minute){
			return -1;
		}else if (time2Minute<time1Minute){
			return 1;
		}else{
			if (time2Second>time1Second){
				return -1;
			}else if(time2Second<time1Second){
				return 1;
			}else{
				return 0;
			}
		}
	}
}

/**
 * 字符串是否为规定的日期格式
 * strToDate(String,String)
 * @param {String} str 要转换的字符串
 * @param {String} _format 要转成的格式(yyyy-MM-dd;yyyy/MM/dd; yyyyMMdd;yyyy年MM月dd日)
 **/
 function dateAble(_str,_format){
 	var year,month,day,datePat,matchArray;
	if(/^(y{4})(-)(M{1,2})\2(d{1,2})$/.test(_format))    
        datePat = /^(\d{4})(-|\/)(\d{1,2})\2(\d{1,2})$/;    
    else if(/^(y{4})(年)(M{1,2})(月)(d{1,2})(日)$/.test(_format))    
        datePat = /^(\d{4})年(\d{1,2})月(\d{1,2})日$/;    
    else if(_format=="yyyyMMdd")    
        datePat = /^(\d{4})(\d{2})(\d{2})$/;    
    else if(/^(y{4})(\/)(M{1,2})\2(d{1,2})$/.test(_format))    
        datePat = /^(\d{4})(-|\/)(\d{1,2})\2(\d{1,2})$/;    
    else{  
        return false;    
    }  
	matchArray = _str.match(datePat);    
    if(matchArray == null){   
        return false;    
    }    
    if(/^(y{4})(-|\/)(M{1,2})\2(d{1,2})$/.test(_format)){    
        year = matchArray[1];    
        month = matchArray[3];    
        day = matchArray[4];    
    }else{    
        year = matchArray[1];    
        month = matchArray[2];    
        day = matchArray[3];    
    }
	if (month < 1 || month > 12){                  
        return false;    
    }    
    if (day < 1 || day > 31){      
        return false;    
    }         
    if ((month==4 || month==6 || month==9 || month==11) && day==31){        
        return false;    
    }         
    if (month==2){    
        var isleap=(year % 4==0 && (year % 100 !=0 || year % 400==0));    
        if (day>29){                       
            return false;    
        }    
        if ((day==29) && (!isleap)){           
            return false;    
        }    
    }    
    return true;   
 }
/**
 * 把字符串转成相应的日期格式。yyyyMMdd --> yyyy-MM-dd 
 * @param {String} str 要转换的字符串
 * @return 如果转换不成功则返回 1900-01-01
 **/
function strToDate(str){
	if(!dateAble(str,'yyyyMMdd')){//可以转化为日期
		return "1900-01-01";
	}else{
		return str.substr(0,4)+"-"+str.substr(4,2)+"-"+str.substr(6,2);
	}
}
/**
 * 处理两个日期的级联。 
 * @param {String} _str 基准日期（yyyy-MM-dd格式）
 * @param {int}    _space 间隔天数
 * @return 目标日期
 **/
function setDate(_str,_space){
 	
 	if(!dateAble(_str,'yyyy-MM-dd')){
		return "1900-01-01";
	}else{
		var _t = new Date(_str.replace(/-/g,   "/"));
		_t = _t.valueOf()+_space*24*60*60*1000; 
		_t = new Date(_t);
		var year = _t.getFullYear();
		var month = (_t.getMonth()+1)>10?(_t.getMonth()+1):"0"+(_t.getMonth()+1);
		var day = _t.getDate()>10?_t.getDate():"0"+_t.getDate(); 
		return year+"-"+month+"-"+day;
	}
 }